using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data;
using System.Collections;
using CapaAccesoDatos;
//autor: Juan Manuel Reyes
namespace CapaAccesoDatos.Clases
{
    public class TipoInfraccionCAD
    {
        //-------------------------------------------------------------------------------//
        // Propiedades de la Clase Tipo_Infraccion.                                      //
        //-------------------------------------------------------------------------------//
        private int id;
        private string descripcion;
        private int cantidadMaxima;
        private int tipoSancionID;

        //-------------------------------------------------------------------------------//
        // Accesores publicos de la Clase Tipo_Infraccion.                               //
        //-------------------------------------------------------------------------------//
        public int Id
        {
            get { return this.id; }
        }
        public string Descripcion
        {
            get { return this.descripcion; }
        }
        public int CantidadMaxima
        {
            get { return this.cantidadMaxima; }
        }
        public int TipoSancionID
        {
            get { return this.tipoSancionID; }
        }

        //-------------------------------------------------------------------------------//
        // Estos son los Constructores de la Clase Tipo_Infraccion.                      //
        //-------------------------------------------------------------------------------//
        private TipoInfraccionCAD(int Id, string Descripcion, int CantidadMaxima, int TipoSancionId)
        {
            this.id = Id;
            this.descripcion = Descripcion;
            this.cantidadMaxima = CantidadMaxima;
            this.tipoSancionID = TipoSancionId;
        }
        private TipoInfraccionCAD(DataRow Row)
        {
            this.id = Convert.ToInt32(Row[Constantes.Tablas.Tipo_Infraccion.Campo_Id]);
            this.descripcion = Convert.ToString(Row[Constantes.Tablas.Tipo_Infraccion.Campo_Descripcion]);
            this.cantidadMaxima = Convert.ToInt32(Row[Constantes.Tablas.Tipo_Infraccion.Campo_Cantidad_Maxima]);
            this.tipoSancionID = Convert.ToInt32(Row[Constantes.Tablas.Tipo_Infraccion.Campo_ID_Tipo_Sancion]);
        }

        //-------------------------------------------------------------------------------//
        //Estos son los metodos de la interface(despreciada a favor de metodos estaticos)//
        //-------------------------------------------------------------------------------//
        public static void Save(TipoInfraccionCAD Objeto)
        {
            String SqlCommand = "INSERT INTO " + Constantes.Tablas.Tipo_Infraccion.Nombre + "(" + 
                                Constantes.Tablas.Tipo_Infraccion.Campo_Descripcion + "," + 
                                Constantes.Tablas.Tipo_Infraccion.Campo_Cantidad_Maxima + "," +
                                Constantes.Tablas.Tipo_Infraccion.Campo_ID_Tipo_Sancion +") VALUES ('" 
                                + Objeto.descripcion.Trim() + "', " 
                                + Objeto.cantidadMaxima.ToString() + ", "  
                                + Objeto.TipoSancionID + ")";

            //Sentencia:
            /*INSERT INTO Tabla (Columna1, Columna2...) 
             VALUES (Registro1, Registro2....); */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_InfraccionCAD.Save(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }
        public static void Update(TipoInfraccionCAD Objeto)
        {
            String SqlCommand = "UPDATE " + Constantes.Tablas.Tipo_Infraccion.Nombre + " SET " + 
                                Constantes.Tablas.Tipo_Infraccion.Campo_Descripcion + "= '" + Objeto.descripcion.Trim() + "', " + 
                                Constantes.Tablas.Tipo_Infraccion.Campo_ID_Tipo_Sancion + " = '" + Objeto.TipoSancionID + "', " +
                                Constantes.Tablas.Tipo_Infraccion.Campo_Cantidad_Maxima + "=" + Objeto.cantidadMaxima.ToString() + 
                                " WHERE " + Constantes.Tablas.Tipo_Infraccion.Campo_Id + " = " + Objeto.id.ToString();

            //Sentencia:
            /*UPDATE Tabla SET Campo1 = Registro1, Campo2 = Registro2.... 
             WHERE Id (de la tabla) = Id; */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_InfraccionCAD.Update(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }
        public static void Delete(TipoInfraccionCAD Objeto)
        {
            String SqlCommand = "DELETE FROM " + Constantes.Tablas.Tipo_Infraccion.Nombre +
                                " WHERE " + Constantes.Tablas.Tipo_Infraccion.Campo_Id + " = " + Objeto.id.ToString();

            //Sentencia:
            /*DELETE FROM Tabla WHERE Id (de la tabla) = Id; */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_InfraccionCAD.Delete(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }

        //-------------------------------------------------------------------------------//
        // Estos son los metodos especiales para el uso de la Capa de Lenguaje de Negocios
        //-------------------------------------------------------------------------------//
        public static TipoInfraccionCAD BuscarInfraccionPorId(int Id)
        {
            TipoInfraccionCAD Retorno = null;
            String SqlCommand = " SELECT * FROM " + Constantes.Tablas.Tipo_Infraccion.Nombre +
                                " WHERE " + Constantes.Tablas.Tipo_Infraccion.Campo_Id +
                                " = " + Id.ToString();
            //La sentencia es
            /* SELECT * FROM Tipo_Infraccion WHERE Id = :P1
             * Donde :P1 es el numero del Id! */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlDataReader Cursor = null;
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Cursor = Comando.ExecuteReader(CommandBehavior.SingleRow);

                while (Cursor.Read())
                {
                    Retorno = new TipoInfraccionCAD(Convert.ToInt32(Cursor[Constantes.Tablas.Tipo_Infraccion.Campo_Id]),
                                                    Convert.ToString(Cursor[Constantes.Tablas.Tipo_Infraccion.Campo_Descripcion]),
                                                    Convert.ToInt32(Cursor[Constantes.Tablas.Tipo_Infraccion.Campo_Cantidad_Maxima]),
                                                    Convert.ToInt32(Cursor[Constantes.Tablas.Tipo_Infraccion.Campo_ID_Tipo_Sancion]));
                }
                Cursor.Close();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_InfraccionCAD.BuscarPorId(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return Retorno;
        }

        public static List<TipoInfraccionCAD> BuscarInfraccionEnLista(List<int> Elementos)
        {
            List<TipoInfraccionCAD> Lista = new List<TipoInfraccionCAD>(); 
            DataSet Resultado = new DataSet();
            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlDataAdapter Adaptador = new SqlDataAdapter();
            SqlCommand ComandoSql = new SqlCommand("SELECT * FROM " + Constantes.Tablas.Tipo_Infraccion.Nombre +
                                                   " WHERE " + Constantes.Tablas.Tipo_Infraccion.Campo_Id +
                                                   " IN (", Conexion);
            //La sentencia es
            /*
             * SELECT * FROM Tipo_Infraccion where ID IN (PARAMS)
             */

            SqlTransaction Tx = null;

            for (int i = 0; i < Elementos.Count; i++)
            {
                if (i == 0)
                    ComandoSql.CommandText += Elementos[i].ToString();
                else
                    ComandoSql.CommandText += "," + Elementos[i].ToString();
            }
            ComandoSql.CommandText += ")";

            if (Elementos.Count == 0)
                return Lista;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Adaptador.SelectCommand = ComandoSql;
                Adaptador.SelectCommand.Transaction = Tx;
                Adaptador.Fill(Resultado, Constantes.Tablas.Tipo_Infraccion.Nombre);
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_InfraccionCAD.BuscarInfraccionEnLista(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                ComandoSql.Dispose();
                Conexion.Dispose();
                Adaptador.Dispose();
            }

            foreach (DataRow Row in Resultado.Tables[Constantes.Tablas.Tipo_Infraccion.Nombre].Rows)
            {
                Lista.Add(new TipoInfraccionCAD(Row));
            }

            return Lista;
        }

        public static List<TipoInfraccionCAD> GetAllInfracciones() 
        {
            DataSet Resultado = new DataSet();
            List<TipoInfraccionCAD> Infracciones = new List<TipoInfraccionCAD>();
            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlDataAdapter Adaptador = new SqlDataAdapter();
            SqlCommand ComandoSql = new SqlCommand("SELECT * FROM " + Constantes.Tablas.Tipo_Infraccion.Nombre, Conexion);

            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();

                Adaptador.SelectCommand = ComandoSql;
                Adaptador.SelectCommand.Transaction = Tx;
                Adaptador.Fill(Resultado, Constantes.Tablas.Tipo_Infraccion.Nombre);
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_InfraccionCAD.GetAllInfracciones(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                ComandoSql.Dispose();
                Conexion.Dispose();
                Adaptador.Dispose();
            }

            foreach (DataRow row in Resultado.Tables[Constantes.Tablas.Tipo_Infraccion.Nombre].Rows) 
            { 
                Infracciones.Add(new TipoInfraccionCAD(row));
            }

            return Infracciones;       
        }

        /*
        public static List<SancionCAD> GetInfracciones(int id)
        {
            DataSet Resultado = new DataSet();
            List<SancionCAD> Sanciones = new List<SancionCAD>();
            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlDataAdapter Adaptador = new SqlDataAdapter();
            SqlCommand ComandoSql = new SqlCommand("SELECT * FROM " + Constantes.Tablas.Tipo_Infraccion.Nombre,Conexion);

            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();

                Adaptador.SelectCommand = ComandoSql;
                Adaptador.SelectCommand.Transaction = Tx;
                Adaptador.Fill(Resultado, Constantes.Tablas.Tipo_Infraccion.Nombre);
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_InfraccionCAD.GetInfracciones(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                ComandoSql.Dispose();
                Conexion.Dispose();
                Adaptador.Dispose();
            }

            foreach (DataRow row in Resultado.Tables[Constantes.Tablas.Tipo_Infraccion.Nombre].Rows) 
            {
                Sanciones.Add(new SancionCAD(row));
            }
            return Sanciones;
        }
        */

        public static List<TipoInfraccionCAD> GetLastInfracciones(UsuarioCAD UsuarioAInvestigar, int Cantidad)
        {
            string selectcmd = "SELECT * FROM " + Constantes.Tablas.Usuarios_Observacion.Nombre +
                               " WHERE " + Constantes.Tablas.Usuarios_Observacion.Campo_Id_Usuario +
                               " = " + UsuarioAInvestigar.Id.ToString() +
                               " ORDER BY "  + Constantes.Tablas.Usuarios_Observacion.Campo_Fecha;


            List<TipoInfraccionCAD> result = new List<TipoInfraccionCAD>();
            SqlConnection connection = new SqlConnection(Constantes.ConnectionString);
            SqlCommand command = new SqlCommand(selectcmd, connection);

            SqlDataReader cursor = null;
            SqlTransaction transaccion = null;

                try
                {
                    connection.Open();
                    transaccion = connection.BeginTransaction();
                    command.Transaction = transaccion;
                    cursor = command.ExecuteReader(CommandBehavior.Default);
                    
                    while (cursor.Read() != false && Cantidad>0)
                    {
                            result.Add(TipoInfraccionCAD.BuscarInfraccionPorId(Convert.ToInt32(cursor[Constantes.Tablas.Usuarios_Observacion.Campo_Id_Tipo_Infraccion])));
                            Cantidad--;
                    }
                    
                    cursor.Close();
                    transaccion.Commit();
                }

                catch (Exception ex)
                {
                    cursor.Close();
                    throw ex;
                }
                finally
                {
                    connection.Close();
                    command.Dispose();
                    connection.Dispose();
                }
                return result;
            }

        public static TipoInfraccionCAD BuscarInfraccionPorDescripcion(string Descripcion)
        {
            TipoInfraccionCAD Retorno = null;
            String SqlCommand = " SELECT * FROM " + Constantes.Tablas.Tipo_Infraccion.Nombre +
                                " WHERE " + Constantes.Tablas.Tipo_Infraccion.Campo_Descripcion +
                                " = '" + Descripcion +"'";

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlDataReader Cursor = null;
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Cursor = Comando.ExecuteReader(CommandBehavior.SingleRow);

                while (Cursor.Read())
                {
                    Retorno = new TipoInfraccionCAD(Convert.ToInt32(Cursor[Constantes.Tablas.Tipo_Infraccion.Campo_Id]),
                                                    Convert.ToString(Cursor[Constantes.Tablas.Tipo_Infraccion.Campo_Descripcion]),
                                                    Convert.ToInt32(Cursor[Constantes.Tablas.Tipo_Infraccion.Campo_Cantidad_Maxima]),
                                                    Convert.ToInt32(Cursor[Constantes.Tablas.Tipo_Infraccion.Campo_ID_Tipo_Sancion]));
                }
                Cursor.Close();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_InfraccionCAD.BuscarPorDescripcion(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return Retorno;
        }

        public static TipoInfraccionCAD CrearTipoInfraccionCAD(int Id, string Descripcion, int CantidadMaxima, int tipoSancionID)
        { 
            return new TipoInfraccionCAD(Id, Descripcion, CantidadMaxima, tipoSancionID);
        }
    }
}